package com.keith.jpa.tenant.config;

import com.google.common.base.CaseFormat;
import com.google.common.base.Strings;
import com.google.common.collect.Sets;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.CollectionUtils;

import java.util.Set;

/**
 * TenantJapConfig.java
 * 租户配置管理类
 *
 * @author czykeih
 * @version 1.0 2023/10/25
 */
@Configuration
@Data
public class TenantJpaConfig {
    /**
     * 是否开启租户处理  默认为false
     */
    @Value("${spring.jpa.tenant.enable:false}")
    private boolean enableTenant;
    /**
     * 数据库租户字段名称 默认为tenant_id
     */
    @Value("${spring.jpa.tenant.tenantColumn:tenant_id}")
    private String tenantColumn;
    /**
     *  数据库租户字段类型 默认为Long
     */
    @Value("${spring.jpa.tenant.tenantColumnType:Long}")
    private String tenantColumnType;
    /**
     * 忽略租户处理的表  多个逗号分割
     */
    @Value("${spring.jpa.tenant.ignoreTables:}")
    private String ignoreTables;
    /**
     * 无注解情况下  默认的租户处理方式   可根据实际情况选择   默认为true
     */
    @Value("${spring.jpa.tenant.defaultTenant:true}")
    private boolean defaultTenant;
    /**
     *  租户值过滤  会替换特定租户id
     */
    @Value("${spring.jpa.tenant.filterTenantIdValues:}")
    private String filterTenantIdValues;
    /**
     *
     * 是否开启租户日志记录  默认为false
     */
    @Value("${spring.jpa.tenant.log:false}")
    private boolean log;

    @Value("${spring.jpa.tenant.penetration:false}")
    private boolean penetration;

    private Set<String> ignoreTablesSet=Sets.newHashSet();

    private Set<String> tenantIdValuesSet=Sets.newHashSet();

    public Set<String> getIgnoreTablesSet() {
        if(CollectionUtils.isEmpty(ignoreTablesSet)&&!Strings.isNullOrEmpty(ignoreTables)){
            ignoreTablesSet= Sets.newHashSet(ignoreTables.split(","));
        }
        return ignoreTablesSet;
    }

    public Set<String> getFilterTenantIds() {
        if(CollectionUtils.isEmpty(tenantIdValuesSet)&&!Strings.isNullOrEmpty(filterTenantIdValues)){
            tenantIdValuesSet= Sets.newHashSet(filterTenantIdValues.split(","));
        }
        return tenantIdValuesSet;
    }

    public String getTenantIdFieldName() {
        return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, tenantColumn);
    }

}
